var util = require('util'),
	fs = require('fs');

/** ログレベル 上の方がより詳細を出す */
var levels = [
	'trace',
	'debug',
	'info',
	'warn',
	'error',
	'fatal'
];

/** ファイルまたはコンソールに出力する関数を返す */
var makeOutputFunction = function(file, level){
	if(file){
		/* ファイル書き出しの場合 */
		return function(str){
			var ws = fs.createWriteStream(file, {flags: 'a+', encoding: 'utf8', mode: 0666});
			ws.end(new Date().toString().slice(0,25) + '[' + (level + ' ').slice(0,5) + '] ' + str + '\n');
		};
	}else{
		/* コンソール出力の場合 */
		return function(str){
			util.puts(new Date().toString().slice(0,25) + '[' + (level + ' ').slice(0,5) + '] ' + str);
		}
	}
};

/**
 * ログレベルと出力先を指定して、ロギングの準備を行う
 * 出力先を指定しない場合はコンソールに出力される
 * levelには上で宣言されている levels の要素のどれかが入る
 */
exports.setting = function(level, file){
	var that = {};
	for(var i = 0, flag = false; i < levels.length; i++){
		if(levels[i] == level){
			flag = true;
		}
		if(flag){
			/* 指定されたログレベル以上には、出力関数を割り当て */
			that[levels[i]] = makeOutputFunction(file, levels[i]);
		}else{
			/* 指定されたログレベル未満には、何もしないダミーの出力関数を割り当て */
			that[levels[i]] = function(){};
		}
	}
	/* どのログレベル指定でも、logメソッドは定義しておく */
	that.log = makeOutputFunction(file, level);
	return that;
};
